#include <iostream>
#include <string>
#include <memory>
#include "mylog.hpp"

void test_log(const std::string &logger_name){
    // 通过全局接口获取指定名称的日志器
    mylog::Logger::ptr logger = mylog::getlogger(logger_name);
    std::string msg = logger_name;
    msg += " hello world";
    int count = 0;
    int i = 0;
    while (i++ < 2){
        logger->DEBUG("%s - %d", msg.c_str(), count++);
        logger->INFO("%s - %d", msg.c_str(), count++);
        logger->WARNING("%s - %d", msg.c_str(), count++);
        logger->ERROR("%s - %d", msg.c_str(), count++);
        logger->FATAL("%s - %d", msg.c_str(), count++);
    }
}

void sync_logger(){
    // 定义同步日志器名称 限制等级 以及输出格式
    std::string logger_name = "sync_logger";
    mylog::loglevel::value level = mylog::loglevel::value::DEBUG;
    std::string pattern = "[%d{%H:%M:%S}][%t][%p][%c] %m%n";

    // 获取一个全局日志器建造者
    std::unique_ptr<mylog::LoggerBuilder> builder(new mylog::GlobalLoggerBuilder());

    // 通过全局建造者完成对全局同步日志器对象的构建
    builder->BuildLoggerName(logger_name);
    builder->BuildLoggerLevel(level); 
    builder->BuildLoggerType(mylog::LoggerType::SYNC_LOGGER);        // 日志器类型设置为同步日志器
    builder->BuildFormatter(pattern);
    builder->BuildSink<mylog::StdcoutSink>();                        // 设置日志落地输出位置——标准输出
    builder->BuildSink<mylog::FileSink>("LogFile/sync.log");         // 设置日志落地输出位置——目标文件输出
    builder->BuildSink<mylog::RollSink>("LogFile/Roll/sync", 300);   // 设置日志落地输出位置——目标文件按大小滚动输出
    builder->Build();                                                // 创建全局同步日志器并存放到日志器管理器中

    std::cout << "同步日志器示例: " << std::endl;
    test_log(logger_name);
}

void async_logger(){
    // 定义异步日志器名称 限制等级 以及输出格式  
    std::string logger_name = "async_logger";
    mylog::loglevel::value level = mylog::loglevel::value::DEBUG;
    std::string pattern = "%m%n";

    // 获取一个全局日志器建造者
    std::unique_ptr<mylog::LoggerBuilder> builder(new mylog::GlobalLoggerBuilder());

    // 通过全局建造者完成对全局异步日志器对象的构建
    builder->BuildLoggerName(logger_name);
    builder->BuildLoggerLevel(level); 
    builder->BuildLoggerType(mylog::LoggerType::ASYNC_LOGGER);        // 日志器类型设置为异步日志器
    builder->BuildFormatter(pattern);
    builder->BuildSink<mylog::StdcoutSink>();                         // 设置日志落地输出位置——标准输出
    builder->BuildSink<mylog::FileSink>("LogFile/async.log");         // 设置日志落地输出位置——目标文件输出
    builder->BuildSink<mylog::RollSink>("LogFile/Roll/async", 300);   // 设置日志落地输出位置——目标文件按大小滚动输出
    builder->Build();                                                 // 创建全局异步日志器并存放到日志器管理器中

    std::cout << "异步日志器示例: " << std::endl;
    test_log(logger_name);
}

int main(){
    sync_logger();
    async_logger();
    // 所有全局日志器优雅的停机
    mylog::shutdown();
    return 0;
}